import config from '@/config'
import storage from '@/utils/storage'
import constant from '@/utils/constant'
import {
	isHttp,
	isEmpty
} from "@/utils/validate"
import {
	getInfo,
	userLogin,
	logout
} from '@/api/login'
import {
	getToken,
	removeToken,
	setToken
} from '@/utils/auth'
import defAva from '@/static/images/agreeBg.png'
import {
	ref
} from 'vue'
import {
	defineStore
} from 'pinia'

const baseUrl = config.baseUrl

export const useUserStore = defineStore('user', () => {
	const token = ref(getToken())
	const id = ref(storage.get(constant.id))
	const name = ref(storage.get(constant.name))
	const avatar = ref(storage.get(constant.avatar))
	const roles = ref(storage.get(constant.roles))
	const permissions = ref(storage.get(constant.permissions))

	const SET_TOKEN = (val) => {
		token.value = val
	}
	const SET_ID = (val) => {
		id.value = val
		storage.set(constant.id, val)
	}
	const SET_NAME = (val) => {
		name.value = val
		storage.set(constant.name, val)
	}
	const SET_AVATAR = (val) => {
		avatar.value = val
		storage.set(constant.avatar, val)
	}
	const SET_ROLES = (val) => {
		roles.value = val
		storage.set(constant.roles, val)
	}
	const SET_PERMISSIONS = (val) => {
		permissions.value = val
		storage.set(constant.permissions, val)
	}

	// 登录
	const loginAction = (userInfo) => {
		return new Promise((resolve, reject) => {
			userLogin(userInfo).then(res => {
				const {
					tokenValue
				} = res
				setToken(tokenValue)
				SET_TOKEN(tokenValue)
				resolve()
			}).catch(error => {
				reject(error)
			})
		})
	}

	// 获取用户信息
	const getInfoAction = () => {
		return new Promise((resolve, reject) => {
			getInfo().then(res => {
				const user = res.user
				let avatar = user.avatar || ""
				if (!isHttp(avatar)) {
					avatar = (isEmpty(avatar)) ? defAva : baseUrl + avatar
				}
				const userid = (isEmpty(user) || isEmpty(user.userId)) ? "" : user.userId
				const username = (isEmpty(user) || isEmpty(user.userName)) ? "" : user
					.userName
				if (res.roles && res.roles.length > 0) {
					SET_ROLES(res.roles)
					SET_PERMISSIONS(res.permissions)
				} else {
					SET_ROLES(['ROLE_DEFAULT'])
				}
				SET_ID(userid)
				SET_NAME(username)
				SET_AVATAR(avatar)
				resolve(res)
			}).catch(error => {
				reject(error)
			})
		})
	}

	// 退出系统
	const logOutAction = () => {
		return new Promise((resolve, reject) => {
			logout(token.value).then(() => {
				SET_TOKEN('')
				SET_ROLES([])
				SET_PERMISSIONS([])
				removeToken()
				storage.clean()
				resolve()
			}).catch(error => {
				reject(error)
			})
		})
	}

	return {
		token,
		id,
		name,
		avatar,
		roles,
		permissions,
		SET_AVATAR,
		login: loginAction,
		getInfo: getInfoAction,
		logOut: logOutAction
	}
})